package com.ruan.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;

//Redis序列化器配置
//将短信验证码存储在 Redis 中，以实现验证码的缓存功能
@Configuration
@Slf4j
public class redisConfig extends CachingConfigurerSupport {

//    创建了一个LettuceConnectionFactory对象，
//    并设置了Redis服务器的主机名和端口号。
//    然后将这个对象返回作为RedisConnectionFactory的Bean
//    @Bean
//    public RedisConnectionFactory redisConnectionFactory() {
////        创建了一个Redis连接工厂对象，并设置了Redis服务器的主机名和端口号。
//        RedisStandaloneConfiguration redisStandaloneConfiguration
//                = new RedisStandaloneConfiguration("localhost", 6379);
////        使用了RedisStandaloneConfiguration和LettuceConnectionFactory来配置连接工厂
//        LettuceConnectionFactory lettuceConnectionFactory
//                = new LettuceConnectionFactory(redisStandaloneConfiguration);
//
////在最新版本的Lettuce库中，setHostName()和setPort()方法已经被弃用。
//// 取而代之的是使用setClientResources()方法来设置连接工厂的主机名和端口号。
////        LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory();
////        lettuceConnectionFactory.setHostName("localhost");
////        lettuceConnectionFactory.setPort(6379);
//        return lettuceConnectionFactory;
//    }

    @Bean
    public RedisTemplate<Object,Object> redisTemplate(RedisConnectionFactory
                                                     connectionFactory){
//        创建了一个RedisTemplate对象，用于操作Redis数据库
        log.info("开始创建redis模板类。。");
        RedisTemplate<Object,Object> redisTemplate=new RedisTemplate<>();

        //设置了键和哈希键的序列化器为 StringRedisSerializer，
        // 这样可以确保存储在 Redis 中的键是以字符串形式存储的，
        // 而不是默认的 JdkSerializationRedisSerializer
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        //将传入的RedisConnectionFactory对象设置为连接工厂
        redisTemplate.setConnectionFactory(connectionFactory);
        //返回一个 RedisTemplate<Object, Object> 对象，用于操作 Redis 数据库
        return redisTemplate;
    }
//通过这个配置类，
//可以方便地在Spring应用程序中使用Redis数据库，包括创建连接工厂和操作Redis数据
}
